<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // 作用域和作用域链
    // 作用域:    代码在执行过程中的有效区域.
    // 作用域链:  在内部函数可以访问外部函数变量的这种机制，用链式查找决定哪些数据能被内部函数访问 (自己有就找自己的  自己没有就向外跳一层找父作用域 => 依次类推直到全局作用域 => window)

    // 执行环境(或者说执行空间)（execution context）
    // 1. JS是单线程,同一时间只能完成一件事 
    // 2. 代码在执行时 按作用域划分 一般分为全局作用域 ,函数作用域, 块级作用域
    //   全局作用域 => 全局执行栈(空间)  => GO对象(global => window => 全局的变量和方法)
    //   函数作用域 => 函数执行栈(空间)  => AO对象(Activation Object => local函数在执行时用于存储函数内容的局部变量和方法 => 一般情况下 函数执行完毕AO对象就会被释放)
    //   块级作用域 => 局部的执行栈()    => AO对象(Activation Object => block)

    /* debugger;

    var a = 10;
    var b = 20;

    function fn() {
        var a = 100;
        b = 200;
        console.log(a, b);
    }

    fn();
    console.log(a, b); */



    debugger;

    function fn() {
        var a = 10;
        console.log("fn执行", a); // 10

        return { // 返回对象
            add: function () {
                a++;
                return a;
            },
            reduce: function () {
                a--;
                return a;
            },
            get() {
                return a;
            },
            set(val) {
                a = val;
                return a;
            }
        };
    }

    var result = fn(); //  result = obj   => 浅复制  result和obj引用同一片内存空间(包含的相关的函数) 
    console.log("result", result);

    var res1 = result.add(); // 11 
    console.log(res1);

    var res2 = result.add(); // 12
    console.log(res2);

    var res3 = result.reduce();
    console.log(res3);

    var res4 = result.set(100);
    console.log(res4);

    var res5 = result.add();
    console.log(res5)

    var res6 = result.get();
    console.log(res6);

</script>

</html>